Release 10.1A: OpenEdge Development:
Messaging and ESB


Publishing, receiving, and parsing an XMLMessage

The procedures example10.p and example11.p (1 of 3) create, publish, receive, and parse an XMLMessage.

To run example10.p and example11.p:

  1. Run example11.p (1 of 3) so the subscriber is running before you publish. The following example subscribes, receives, and parses an XMLMessage:
  2. example11.p
    /* Receives and parse an XML message. */ 
    DEFINE VARIABLE pubsubsession AS HANDLE. 
    DEFINE VARIABLE msgConsumer1 AS HANDLE. 
    DEFINE VARIABLE stillWaiting AS LOGICAL INIT yes. 
    DEFINE VARIABLE msgNum AS INT INIT 0. 
    RUN jms/pubsubsession.p PERSISTENT SET pubsubsession  
                                      ("-H localhost -S 5162 "). 
    RUN setBrokerURL IN pubsubsession ("localhost:2506"). 
    RUN beginSession IN pubsubsession. 
    RUN createMessageConsumer IN pubsubsession 
          (THIS-PROCEDURE, "messageHandler", OUTPUT msgConsumer1). 
    RUN subscribe IN pubsubsession ("people", 
                                    ?,  
                                    ?, 
                                    no,  
                                    msgConsumer1) NO-ERROR. 
    RUN startReceiveMessages IN pubsubsession. 
    RUN waitForMessages IN pubsubsession ("inWait", THIS-PROCEDURE, ?). 
    RUN deleteSession IN pubsubsession. 
    
    PROCEDURE messageHandler: 
    DEFINE INPUT PARAMETER messageH AS HANDLE NO-UNDO. 
    DEFINE INPUT PARAMETER messageConsumerH AS HANDLE NO-UNDO. 
    DEFINE OUTPUT PARAMETER replyH AS HANDLE NO-UNDO. 
    DEFINE VAR memptrDoc AS MEMPTR.  
    DEFINE VAR hdoc AS HANDLE. 
    DEFINE VAR hRoot AS HANDLE. 
    DEFINE VAR xmlText AS CHAR. 
    DEFINE VAR indx AS INT. 
        CREATE X-DOCUMENT hdoc. 
        CREATE X-NODEREF hRoot. 
        SET-SIZE(memptrDoc) = 400000. /* The size is an estimate. */ 
        indx = 1. 
        DO WHILE NOT  DYNAMIC-FUNCTION('endOfStream' IN messageH): 
          xmlText = DYNAMIC-FUNCTION('getTextSegment':U IN messageH). 
          PUT-STRING(memptrDoc, indx)  =  xmlText. 
          indx = indx + LENGTH(xmlText). 
        END. 
        hdoc:LOAD("memptr", memptrDoc, FALSE). 
        hdoc:GET-DOCUMENT-ELEMENT(hRoot). 
        RUN getPeople(hRoot, 1). 
        RUN deleteMessage IN messageH. 
        SET-SIZE(memptrDoc) = 0. 
        stillWaiting = false. 
    END. 
    
    /* Displays the XML node names and XML text. */ 
    PROCEDURE getPeople: 
    DEFINE INPUT PARAMETER hParent AS HANDLE. 
    DEFINE INPUT PARAMETER level AS INT. 
    DEFINE VAR i AS INT. 
    DEFINE VAR hNoderef AS HANDLE. 
        CREATE X-NODEREF hNoderef. 
        REPEAT i = 1 TO hParent:NUM-CHILDREN. 
            hParent:GET-CHILD(hNoderef,i). 
            IF hNoderef:NAME = "#text" THEN 
               MESSAGE "Text: " hNoderef:NODE-VALUE. 
            ELSE 
               MESSAGE "Node name: " hNoderef:NAME. 
            RUN getPeople(hNoderef, (level + 1)). 
        END. 
        DELETE OBJECT hNoderef. 
    END. 
    
    FUNCTION inWait RETURNS LOGICAL. 
    RETURN stillWaiting. 
    END. 
    

  3. Run example10.p to create and publish an XMLMessage with the data of 100 people, as shown:
  4. example10.p 
    /* Publishes an XML message. */ 
    DEFINE VARIABLE pubsubsession AS HANDLE. 
    DEFINE VARIABLE mesgH AS HANDLE. 
    DEFINE VARIABLE person AS CHAR INIT "". 
    DEFINE VARIABLE i AS INT. 
    RUN jms/pubsubsession.p PERSISTENT SET pubsubsession  
                                      ("-H localhost -S 5162 "). 
    RUN setBrokerURL IN pubsubsession ("localhost:2506"). 
    RUN beginSession IN pubsubsession. 
    RUN createXMLMessage IN pubsubsession (OUTPUT mesgH). 
    
    /* Creates an XML message with 100 people. */ 
    RUN appendText IN mesgH('<?xml version="1.0" '). 
    RUN appendText IN mesgH("encoding='ISO8859-1' ?>"). 
    RUN appendText IN mesgH("<personnel>"). 
    REPEAT i = 1 TO 100: 
      person =           "<person>". 
      person = person +     "<name>". 
      person = person +         "<family>SecondName</family>". 
      person = person +         "<given>FirstName" + STRING(i) + "</given>". 
      person = person +       "</name>". 
      person = person +     "<email>myEmail@subpargolf.com</email>". 
      person = person +  "</person>". 
      RUN appendText IN mesgH(person). 
    END. 
    RUN appendText IN mesgH("</personnel>"). 
    RUN publish IN pubsubsession ("people", mesgH, ?, ?, ?). 
    RUN deleteMessage IN mesgH. 
    RUN deleteSession IN pubsubsession. 
    


Copyright © 2005 Progress Software Corporation
www.progress.com
Voice: (781) 280-4000
Fax: (781) 280-4095